package com.g8.pethospitallearnbackend.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.stereotype.Component;

import java.util.Calendar;
import java.util.Map;

@Component
public class JWTUtil {
    private  static final String KEY = "pethospitallearn";//设置密钥（要想非对称加密这里换成私钥）
    // 注意！这里不能用注入，甚至不能用userService去检查权限，只能把role字段也放到token里，因为拦截是在这个前面的
//    @Autowired
//    private static UserService userService;

    /**
     * 接收业务数据，生成token并返回
     */
    public static String generateToken(Map<String, String> map) {
        Calendar instance = Calendar.getInstance();
        //暂时默认7天过期
        instance.add(Calendar.DATE,7);
//        instance.add(Calendar.MINUTE,1);
        //创建jwt builder
        JWTCreator.Builder builder = JWT.create();

        map.forEach(builder::withClaim);

        return builder.withExpiresAt(instance.getTime())//有效期
                .sign(Algorithm.HMAC256(KEY));
    }

    /**
     * 解析token，验证其合法性
     * @param token token字符串
     * @return 解析后的token
     */
    public static DecodedJWT verify(String token){
        //返回验证结果（结果是内置的）
        return JWT.require(Algorithm.HMAC256(KEY)).build().verify(token);
    }

    /**
     * 获取token中的用户的角色
     */
    public static int getRole(String token) throws Exception {
        if (token.isBlank()) throw new Exception("token为空");
        String userRole = JWT.require(Algorithm.HMAC256(KEY)).build().verify(token).getClaim("userRole").asString();
        return Integer.parseInt(userRole);
    }

    /**
     * 获取token中的用户的id
     */
    public static String getId(String token) throws Exception {
        if (token.isBlank()) throw new Exception("token为空");
        return JWT.require(Algorithm.HMAC256(KEY)).build().verify(token).getClaim("userId").asString();
    }

}
